/*
 * Simple test file for cxxomfort
 * When compiled and run, this will print information about the
 * C++ and cxxomfort install.
 *
 * 0info.cpp is a much simpler version that only
 * outputs the information of cxxomfort's info object.
 *
 * This and other examples assume cxxomfort is installed in
 * include library path; if otherwise, set eg.: -I flag accordingly.
 */
//#define CXXOMFORT_NOTICES 2
#include <cxxomfort/base.hpp>
#include <cxxomfort/backports.hpp>
#include <cxxomfort/library.hpp>
//#include <cxxomfort/library/ctime.hpp>
//#include <cxxomfort/library/expected.hpp>
#include <cxxomfort/library/numeric.hpp>
#include <cxxomfort/library/ratio.hpp>
// library features
#include <cxxomfort/library/array_ref.hpp>
#include <cxxomfort/library/fixed_vector.hpp>
//#include <cxxomfort/library/static_vector.hpp>

#include <iterator>
#include <iostream>

#define ZSHOW_SUPPORT(macro) (CXXO_IF_MACRO(macro,'C') ? ("" #macro " : " CXXO_STRINGIZE(macro) "\n") : "")

int main () {
	using namespace std;
    cxxomfort::output_info(stdout);
    cout<< endl;

	cout<< "<algorithm>"<< endl;
	cout<< ZSHOW_SUPPORT(CXXO_LIB_is_clamped);
	cout<< ZSHOW_SUPPORT(CXXO_LIB_clamp_halfopen);
	cout<< ZSHOW_SUPPORT(CXXO_LIB_minmax_function_element);
	cout<< ZSHOW_SUPPORT(CXXO_LIB_map_frequencies);
	cout<< ZSHOW_SUPPORT(CXXO_LIB_unstable_remove);
	cout<< ZSHOW_SUPPORT(CXXO_LIB_find_predicate2);
	cout<< ZSHOW_SUPPORT(CXXO_LIB_eraseif);
	cout<< ZSHOW_SUPPORT(CXXO_LIB_transform_inplace);

	cout<< "<functional>:"<< endl;
	cout<< ZSHOW_SUPPORT(CXXO_LIB_ptr_fun_nullary);
	cout<< ZSHOW_SUPPORT(CXXO_LIB_function_ref);
	cout<< ZSHOW_SUPPORT(CXXO_LIB_equivalent_to);
	cout<< ZSHOW_SUPPORT(CXXO_LIB_leftassign_operators);
	cout<< ZSHOW_SUPPORT(CXXO_LIB_overload_pattern);

	cout<< "<iterator>:"<< endl;
	cout<< ZSHOW_SUPPORT(CXXO_LIB_function_iterator);
	cout<< ZSHOW_SUPPORT(CXXO_LIB_indirect_iterator);
	cout<< ZSHOW_SUPPORT(CXXO_LIB_ssize);

	cout<< "<memory>:"<< endl;
	cout<< ZSHOW_SUPPORT(CXXO_LIB_scoped_ptr);
	cout<< ZSHOW_SUPPORT(CXXO_LIB_noexcept_allocator);

	cout<< "<numeric>:"<< endl;
	cout<< ZSHOW_SUPPORT(CXXO_LIB_egcd);
	cout<< ZSHOW_SUPPORT(CXXO_LIB_to_signed);

	cout<< "<ostream>:"<< endl;


	cout<< "<random>:"<< endl;
	cout<< ZSHOW_SUPPORT(CXXO_LIB_uniform_pick_choose);
	cout<< ZSHOW_SUPPORT(CXXO_LIB_lcg_variants);
	cout<< ZSHOW_SUPPORT(CXXO_LIB_prng_rand48);
	cout<< ZSHOW_SUPPORT(CXXO_LIB_prng_splitmix);

	cout<< "<ratio>:"<< endl;
	cout<< ZSHOW_SUPPORT(CXXO_LIB_iso80000_bi_prefixes);

	cout<< "<tuple>:"<< endl;
	cout<< ZSHOW_SUPPORT(CXXO_LIB_tuple_index);
	cout<< ZSHOW_SUPPORT(CXXO_LIB_tuple_shift_unshift);
	cout<< ZSHOW_SUPPORT(CXXO_LIB_tuple_pop_push);
	cout<< ZSHOW_SUPPORT(CXXO_LIB_for_tuple);

	cout<< "<type_traits>:"<< endl;
	cout<< ZSHOW_SUPPORT(CXXO_LIB_integral_constant_literals);
	cout<< ZSHOW_SUPPORT(CXXO_LIB_is_scoped_enum);
	cout<< ZSHOW_SUPPORT(CXXO_LIB_is_propagate_cv);

	cout<< "<utility>:"<< endl;
	cout<< ZSHOW_SUPPORT(CXXO_LIB_absdiff);
	cout<< ZSHOW_SUPPORT(CXXO_LIB_take);
	cout<< ZSHOW_SUPPORT(CXXO_LIB_swap_if);
	cout<< ZSHOW_SUPPORT(CXXO_LIB_pair_aggregate);

	cout<< "\n\n";
	cout<< "Library Features:"<< endl;
	cout<< ZSHOW_SUPPORT(CXXO_LIB_array_ref);
	cout<< ZSHOW_SUPPORT(CXXO_LIB_baseconv);
	cout<< ZSHOW_SUPPORT(CXXO_LIB_fixed_vector);
	cout<< ZSHOW_SUPPORT(CXXO_LIB_if_int128);
	cout<< ZSHOW_SUPPORT(CXXO_LIB_foreach);
	cout<< ZSHOW_SUPPORT(CXXO_LIB_siesta_code);
	cout<< ZSHOW_SUPPORT(CXXO_LIB_static_vector);

}
